<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div class="list">
        <li>01</li>
        <li>02</li>
        <li>03</li>
        <li>04</li>
        <li>05</li>
        <li>06</li>
    </div>
</body>
<script>
    // call apply应用  => 借鸡生蛋 (实现代码的复用)

    // 伪数组转真数组   => 本质:新建数组,遍历伪数组,将每个元素放到新数组中
    var liList = document.querySelectorAll(".list li");

    // var list = Array.from(liList);
    // var list = [...liList];

    // liList.slice();  //伪数组不能直接使用数组的方法 => 报错

    // 模拟封装slice -> 方便理解
    // Array.prototype.mySlice = function (startIndex = 0, endIndex = this.length) {
    //     // this -> 调用此方法的实例化对象
    //     var newArr = [];
    //     for (var i = startIndex; i < endIndex; i++) {
    //         var item = this[i];
    //         newArr.push(item);
    //     }
    //     return newArr;
    // }

    // var arr = [1, 4, 7, 2, 5, 8, 3, 6, 9];
    // var res = arr.mySlice(0, arr.length);
    // console.log(res);

    // 如何让伪数组使用 数组的slice方法?

    // Array.prototype.slice  -> 通过数组的原型对象找到方法
    // var list = Array.prototype.slice.call(liList);  // 调用方法 将this指向liList
    // var list = Array.prototype.slice.apply(liList);  // 调用方法 将this指向liList
    // console.log(list);


    // apply()  的应用
    // 1. 改变this指向
    // 2. 把参数整合到数组中传入

    // var max = Math.max(1, 4, 7, 3, 6, 9, 2, 5, 8);
    // console.log(max);

    // Math.max = function () {
    //     // arguments 接收实际参数的集合
    //     var max = arguments[0];
    //     for (var i = 1; i < arguments.length; i++) {
    //         var item = arguments[i];
    //         if (item > max) {
    //             max = item;
    //         }
    //     }
    //     return max;
    // }

    // var list = [1, 4, 7, 3, 6, 9, 2, 5, 8];
    // var max = Math.max.apply(null, list);
    // console.log(max);

    // var max = Math.max(...list); // 新版本  ...
    // console.log(max);



    // bind  -> 根据原函数得到新函数

    // var data = {
    //     a: 10,
    //     b: 20,
    // }

    // var obj = {
    //     a: Number(true),
    //     b: 200,
    //     sum: function () {
    //         return this.a + this.b
    //     }.bind(data)  // sum 绑定的是新函数
    // }


    // var res = obj.sum();
    // console.log(res);

    // var res = obj.sum();
    // console.log(res);

    // var res = obj.sum();
    // console.log(res);















</script>

</html>